module Display 
(
    input  logic        clk_1k,     // 1kHz扫描时钟（周期1ms）
    input  logic        rst,      // 高电平复位（有效时熄灭所有数码管）
    input  logic        en,         // 模块使能（0-冻结显示，1-正常扫描）
    input  logic [4:0]  data [0:7], // 显示数据（索引0对应最左位数码管）
    input  logic [7:0]  decimal,    // 小数点控制（bit0对应最左位）
    output logic [7:0]  seg_sel,    // 位选信号（低有效，bit0对应最左位数码管，bit7→最右位）
    output logic [7:0]  seg_data    // 段码输出（低有效，[7:0]=dp,g,f,e,d,c,b,a）
);
 
// 内部信号声明 
logic [2:0] scan_cnt;               // 扫描计数器（0-7循环）
logic [4:0] current_data;           // 当前处理的数据 
logic       current_decimal;        // 当前小数点状态 
logic [6:0] seg_data_without_dp;    // 不含小数点的段码

// 基础段码映射表（共阳极，低电平有效）
function automatic logic [6:0] seg_map(input [4:0] code);
    case(code)
        // 数字段码定义（g,f,e,d,c,b,a）
        5'd0:  return 7'b100_0000; // 0 
        5'd1:  return 7'b111_1001; // 1 
        5'd2:  return 7'b010_0100; // 2 
        5'd3:  return 7'b011_0000; // 3 
        5'd4:  return 7'b001_1001; // 4 
        5'd5:  return 7'b001_0010; // 5 
        5'd6:  return 7'b000_0010; // 6 
        5'd7:  return 7'b111_1000; // 7 
        5'd8:  return 7'b000_0000; // 8 
        5'd9:  return 7'b001_0000; // 9 
        
        // 字母段码定义 
        5'd10: return 7'b000_1000; // A 
        5'd11: return 7'b000_0011; // b 
        5'd12: return 7'b100_0110; // C 
        5'd13: return 7'b010_0001; // d 
        5'd14: return 7'b000_0110; // E 
        5'd15: return 7'b000_1110; // F 
        5'd16: return 7'b000_1100; // P 
        5'd17: return 7'b100_0001; // U 
        5'd18: return 7'b001_0001; // Y 
        5'd19: return 7'b111_1100; // L 
        
        // 特殊符号 
        5'd20: return 7'b000_0000; // 全亮
        5'd21: return 7'b111_1111; // 全灭 
        5'd22: return 7'b011_1111; // - 
        default: return 7'b111_1111; // 全灭 
    endcase 
endfunction 
 
// 扫描计数器（0-7循环）
always_ff @(posedge clk_1k or posedge rst) begin
    if (rst) begin
        scan_cnt <= 3'd0;          // 复位归零
    end else if (en) begin
        scan_cnt <= scan_cnt + 1;  // 使能时正常扫描
    end
end
 
// 动态数据选择
always_comb begin
    current_data = data[scan_cnt];          // 选择当前数码管数据
    current_decimal = decimal[scan_cnt];// 小数点对应位（bit0→最左）
    seg_data_without_dp = seg_map(current_data); // 获取基础段码
end

// 输出信号生成
always_ff @(posedge clk_1k or posedge rst) begin
    if (rst) begin
        seg_sel  <= 8'hFF;  // 复位时全灭
        seg_data <= 8'hFF;
    end else if (en) begin
        seg_sel  <= ~(8'b0000_0001 << scan_cnt); // 动态位选（低有效）
        seg_data <= {~current_decimal, seg_data_without_dp}; // 组合段码
    end else begin
        seg_sel  <= seg_sel; // 使能关闭时冻结显示
        seg_data <= seg_data;
    end
end
 
endmodule